import { Sequelize } from 'sequelize';
import config from '../config/mysqlconfig.js';
import Redis from 'redis';

// 创建Sequelize实例
const sequelize = new Sequelize(
  config.database.database,
  config.database.username,
  config.database.password,
  {
    host: config.database.host,
    port: config.database.port,
    dialect: config.database.dialect,
    pool: {
      max: 10,
      min: 0,
      acquire: 30000,
      idle: 10000
    },
    define: {
      timestamps: true,  // 默认为模型添加 createdAt 和 updatedAt 字段
      paranoid: true,    // 使用软删除（deletedAt 而不是真正删除数据）
      underscored: true, // 使用下划线命名法（user_name）而不是驼峰命名法（userName）
      charset: 'utf8mb4',
      collate: 'utf8mb4_general_ci'
    },
    logging: process.env.NODE_ENV === 'development' ? console.log : false
  }
);

// 创建Redis客户端
const redisClient = Redis.createClient({
  socket: {
    host: config.redis.host,
    port: config.redis.port
  },
  password: config.redis.password || undefined
});

// 连接Redis
const connectRedis = async () => {
  try {
    await redisClient.connect();
    console.log('Redis连接成功');
  } catch (err) {
    console.error('Redis连接失败:', err);
    // 5秒后尝试重连
    setTimeout(connectRedis, 5000);
  }
};

connectRedis();

// 处理Redis错误
redisClient.on('error', (err) => {
  console.error('Redis错误:', err);
});

// 测试数据库连接
const testConnection = async () => {
  try {
    await sequelize.authenticate();
    console.log('数据库连接成功');
  } catch (error) {
    console.error('数据库连接失败:', error);
    process.exit(1);
  }
};

// 同步数据库模型（开发环境下使用）
const syncModels = async () => {
  if (process.env.NODE_ENV === 'development') {
    try {
      // { force: true } 将删除表并重新创建
      // { alter: true } 将根据模型更改表结构
      await sequelize.sync({ alter: false });
      console.log('数据库模型同步成功');
    } catch (error) {
      console.error('数据库模型同步失败:', error);
    }
  }
};

export { sequelize, redisClient, testConnection, syncModels };
